# -*- coding: utf-8 -*-
# 姓名:谚语
# 开发时间:2022/11/11 20:21
"""
                    deque
类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop)

返回一个新的双向队列对象，从左到右初始化(用方法 append()) ，从 iterable （迭代对象) 数据创建。如果 iterable 没有指定，新队列为空。

append(x)
添加 x 到右端。

appendleft(x)
添加 x 到左端。

clear()
移除所有元素，使其长度为0.

copy()
创建一份浅拷贝。

3.5 新版功能.

count(x)
计算 deque 中元素等于 x 的个数。

3.2 新版功能.

extend(iterable)
扩展deque的右侧，通过添加iterable参数中的元素。

extendleft(iterable)
扩展deque的左侧，通过添加iterable参数中的元素。注意，左添加时，在结果中iterable参数中的顺序将被反过来添加。

index(x[, start[, stop]])
返回 x 在 deque 中的位置（在索引 start 之后，索引 stop 之前）。 返回第一个匹配项，如果未找到则引发 ValueError。

3.5 新版功能.

insert(i, x)
在位置 i 插入 x 。

如果插入会导致一个限长 deque 超出长度 maxlen 的话，就引发一个 IndexError。

3.5 新版功能.

pop()
移去并且返回一个元素，deque 最右侧的那一个。 如果没有元素的话，就引发一个 IndexError。

popleft()
移去并且返回一个元素，deque 最左侧的那一个。 如果没有元素的话，就引发 IndexError。

remove(value)
移除找到的第一个 value。 如果没有的话就引发 ValueError。

reverse()
将deque逆序排列。返回 None 。

3.2 新版功能.

rotate(n=1)
向右循环移动 n 步。 如果 n 是负数，就向左循环。

如果deque不是空的，向右循环移动一步就等价于 d.appendleft(d.pop()) ， 向左循环一步就等价于 d.append(d.popleft()) 。

Deque对象同样提供了一个只读属性:

maxlen
Deque的最大尺寸，如果没有限定的话就是 None 。

3.1 新版功能.

除了以上操作，deque 还支持迭代、封存、len(d)、reversed(d)、copy.copy(d)、copy.deepcopy(d)、成员检测运算符 in 以及下标引用例如通过 d[0]
访问首个元素等。 索引访问在两端的复杂度均为 O(1) 但在中间则会低至 O(n)。 如需快速随机访问，请改用列表。

Deque从版本3.5开始支持 __add__(), __mul__(), 和 __imul__() 。
"""

from collections import deque

q = deque([1, 2, 3])

print(q.popleft())
print(q.pop())

"""
Python @property装饰器详解
既要保护类的封装特性，又要让开发者可以使用“对象.属性”的方式操作操作类属性，除了使用 property() 函数，Python 还提供了 @property 装饰器。
通过 @property 装饰器，可以直接通过方法名来访问方法，不需要在方法名后添加一对“（）”小括号。

@property 的语法格式如下：
@property
def 方法名(self)
    代码块
"""


class Rect:
    def __init__(self, area):
        self.__area = area

    @property
    def area(self):
        return self.__area


rect = Rect(30)
# 直接通过方法名来访问 area 方法
print("矩形的面积是：", rect.area)


# order_by排序方法: 可以指定根据模型中某个属性进行排序，"模型名.属性名.desc()"代表降序排序